/*
 * Clase MetodosMesaAyuda: Se declaran métodos para registrar y/o modificar
 *      usuarios y ticket.
 */

package mesaayuda.mrysi.DAO;

import java.text.DateFormat;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import mesaayuda.mrysi.model.Causascerrarticket;
import mesaayuda.mrysi.model.Departamento;
import mesaayuda.mrysi.model.Ticket;
import mesaayuda.mrysi.model.Tipousuario;
import mesaayuda.mrysi.model.Topicoayuda;
import mesaayuda.mrysi.model.Usuario;

/**
 *
 * @author Giovany Emilio Marín García
 */

public class MetodosMesaAyuda {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("GiovanyMarinPU");
    
    public void RegistrarUsuario(short vIdUsuario, short vIdTipoUsuario, String vApPaterno, 
            String vApMaterno, String vNombre, String vEmail, String vTelefono, String vUsuario,
            String vPassword)
    {
        try
        {
            UsuarioJpaController usuarioDAO = new UsuarioJpaController(emf);
            TipousuarioJpaController tipoUsuarioDAO = new TipousuarioJpaController(emf);
        
            Usuario iUsuario = new Usuario();
            iUsuario.setIdusuario((short)vIdUsuario);
        
            Tipousuario iTipoUsuario = new Tipousuario();
            iTipoUsuario = tipoUsuarioDAO.findTipousuario((short)vIdTipoUsuario);
        
            iUsuario.setIdtipousuario(iTipoUsuario);
            iUsuario.setAppaterno(vApPaterno);
            iUsuario.setApmaterno(vApMaterno);
            iUsuario.setNombre(vNombre);
            iUsuario.setEmail(vEmail);
            iUsuario.setTelefono(vTelefono);
            iUsuario.setUsuario(vUsuario);
            iUsuario.setContraseña(vPassword);
        
            usuarioDAO.create(iUsuario);
       
            System.out.println("El usuario: " + vNombre + " " + vApPaterno + " " + vApMaterno + " fué registrado correctamente");
        }
        catch(Exception e)
        {
            System.out.println("Error al registrar el usuario: " + vNombre + " " + vApPaterno + " " + vApMaterno);
        }
    }
    
    public void ModificarUsuario(short vIdUsuario, short vIdTipoUsuario, String vApPaterno, 
            String vApMaterno, String vNombre, String vEmail, String vTelefono, String vUsuario, 
            String vPassword)
    {
        try
        {
            UsuarioJpaController usuarioDAO = new UsuarioJpaController(emf);
            TipousuarioJpaController tipoUsuarioDAO = new TipousuarioJpaController(emf);
        
            Usuario iUsuario = new Usuario();
            iUsuario = usuarioDAO.findUsuario((short)vIdUsuario);
            
            if(vIdTipoUsuario != 0)
            {
                Tipousuario iTipoUsuario = new Tipousuario();
                iTipoUsuario = tipoUsuarioDAO.findTipousuario((short)vIdTipoUsuario);
                iUsuario.setIdtipousuario(iTipoUsuario);
            }
            
            if(vApPaterno != "") 
                iUsuario.setAppaterno(vApPaterno);
            if(vApMaterno != "")
                iUsuario.setApmaterno(vApMaterno);
            if(vNombre != "")
                iUsuario.setNombre(vNombre);
            if(vEmail != "")
                iUsuario.setEmail(vEmail);
            if(vTelefono != "")
                iUsuario.setTelefono(vTelefono);
            if(vUsuario != "")
                iUsuario.setUsuario(vUsuario);
            if(vPassword != "")
                iUsuario.setContraseña(vPassword);
            
            usuarioDAO.edit(iUsuario);
            
            System.out.println("El usuario fué modificado correctamente, Usuario: " + iUsuario.getNombre() + " " + iUsuario.getAppaterno() + " " + iUsuario.getApmaterno());            
        }
        catch(Exception e)
        {
            System.out.println("Error al modificar el usuario");
        }
    }
    
    public void RegistrarTicket(short vIdTicket, short vIdUsuarioSolicitante, short vIdUsuarioAtiende,
            short vIdDepartamento, short vIdTopicoAyuda, short vIdCausasCerrarTicket, int vNumFolio,
            String vDescripcionTicket, String vStatus, short vCalificacion, short vResolvioProblema)
    {
        try
        {
            TicketJpaController ticketDAO = new TicketJpaController(emf);
            UsuarioJpaController usuarioDAO = new UsuarioJpaController(emf);
            DepartamentoJpaController departamentoDAO = new DepartamentoJpaController(emf);
            TopicoayudaJpaController topicoAyudaDAO = new TopicoayudaJpaController(emf);
            CausascerrarticketJpaController causasCerrarTicketDAO = new CausascerrarticketJpaController(emf);
        
            Ticket iTicket = new Ticket();
            iTicket.setIdticket((short)vIdTicket);
        
            Usuario iUsuarioSolicitante = new Usuario();
            iUsuarioSolicitante = usuarioDAO.findUsuario((short)vIdUsuarioSolicitante);
            iTicket.setIdusuariosolicitante(iUsuarioSolicitante);
            
            Usuario iUsuarioAtiende = new Usuario();
            iUsuarioAtiende = usuarioDAO.findUsuario((short)vIdUsuarioAtiende);
            iTicket.setIdusuarioatiende(iUsuarioAtiende);
            
            Departamento iDepartamento = new Departamento();
            iDepartamento = departamentoDAO.findDepartamento((short)vIdDepartamento);
            iTicket.setIddepartamento(iDepartamento);
            
            Topicoayuda iTopicoAyuda = new Topicoayuda();
            iTopicoAyuda = topicoAyudaDAO.findTopicoayuda((short)vIdTopicoAyuda);
            iTicket.setIdtopicoayuda(iTopicoAyuda);
            
            Causascerrarticket iCausasCerrarTicket = new Causascerrarticket();
            iCausasCerrarTicket = causasCerrarTicketDAO.findCausascerrarticket((short)vIdCausasCerrarTicket);
            iTicket.setIdcausascerrarticket(iCausasCerrarTicket);
            
            iTicket.setNumfolio(vNumFolio);
            iTicket.setDescripcionticket(vDescripcionTicket);
            iTicket.setStatus(vStatus);
            iTicket.setCalificacion(vCalificacion);
            iTicket.setResolvioproblema((short)vResolvioProblema);
            
            DateFormat dfDateMedium = DateFormat.getDateInstance(DateFormat.MEDIUM);
            iTicket.setFecharegistro(dfDateMedium.parse("22/02/2014"));
            
            ticketDAO.create(iTicket);
       
            System.out.println("El ticket fué registrado correctamente, Folio: " + iTicket.getNumfolio());
        }
        catch(Exception e)
        {
            System.out.println("Error al registrar el ticket");
        }
    }
    
    public void ModificarTicket(short vIdTicket, short vIdUsuarioAtiende, short vIdDepartamento, 
            short vIdTopicoAyuda, short vIdCausasCerrarTicket, String vDescripcionTicket, 
            String vStatus, short vCalificacion, short vResolvioProblema)
    {
        try
        {
            TicketJpaController ticketDAO = new TicketJpaController(emf);
            UsuarioJpaController usuarioDAO = new UsuarioJpaController(emf);
            DepartamentoJpaController departamentoDAO = new DepartamentoJpaController(emf);
            TopicoayudaJpaController topicoAyudaDAO = new TopicoayudaJpaController(emf);
            CausascerrarticketJpaController causasCerrarTicketDAO = new CausascerrarticketJpaController(emf);
        
            Ticket iTicket = new Ticket();
            iTicket = ticketDAO.findTicket((short)vIdTicket);
            
            if(vIdUsuarioAtiende != 0)
            {
                Usuario iUsuarioAtiende = new Usuario();
                iUsuarioAtiende = usuarioDAO.findUsuario((short)vIdUsuarioAtiende);
                iTicket.setIdusuarioatiende(iUsuarioAtiende);
            }
            
            if(vIdDepartamento != 0)
            {
                Departamento iDepartamento = new Departamento();
                iDepartamento = departamentoDAO.findDepartamento((short)vIdDepartamento);
                iTicket.setIddepartamento(iDepartamento);
            }
            
            if(vIdTopicoAyuda != 0)
            {
                Topicoayuda iTopicoAyuda = new Topicoayuda();
                iTopicoAyuda = topicoAyudaDAO.findTopicoayuda((short)vIdTopicoAyuda);
                iTicket.setIdtopicoayuda(iTopicoAyuda);
            }
            
            if(vIdCausasCerrarTicket != 0)
            {
                Causascerrarticket iCausasCerrarTicket = new Causascerrarticket();
                iCausasCerrarTicket = causasCerrarTicketDAO.findCausascerrarticket((short)vIdCausasCerrarTicket);
                iTicket.setIdcausascerrarticket(iCausasCerrarTicket);
            }
            
            if(vDescripcionTicket != "")
                iTicket.setDescripcionticket(vDescripcionTicket);
            if(vStatus != "")
                iTicket.setStatus(vStatus);
            if(vCalificacion != 0)
                iTicket.setCalificacion(vCalificacion);
            if(vResolvioProblema != 0)
                iTicket.setResolvioproblema((short)vResolvioProblema);
            
            ticketDAO.edit(iTicket);
            
            System.out.println("El ticket fué modificado correctamente, Folio: " + iTicket.getNumfolio());            
        }
        catch(Exception e)
        {
            System.out.println("Error al modificar el ticket");
        }
    }
    
    /* 
     * Nombre del metodo: obtieneCountStatusTicket.
     * Parametros: Recibe un parametro de tipo String el cual puede llevar solo dos valores: Abierto o Cerrado.
     * Valor que devuelve: Regresa un valor de tipo int, que indica cuantos tickets estan abiertos o cerrados.
     * Descripción: Metodo que recibe un parametro String cuyo valor solo puede ser Abierto o Cerrado, posteriormente
     *      se realiza una consulta a la entidad Ticket para obtener y devolver el número de tickets abiertos o
     *      cerrados dependiendo del valor del parametro.
     */
    private EntityManagerFactory factory;
    public int obtieneCountStatusTicket(String vStatus)
    {
        factory = Persistence.createEntityManagerFactory("GiovanyMarinPU");
        EntityManager em = factory.createEntityManager();
        
        try
        {
            Query q = em.createQuery("SELECT COUNT(t) FROM Ticket t WHERE t.status = :Status");
            q.setParameter("Status", vStatus);
            Object vTotal = q.getSingleResult();
            if(vTotal == null)
            {
                return 0;
            }
            return Integer.valueOf(vTotal.toString());
        }
        catch(Exception e)
        {
            System.out.println("Error al obtener el número de tickets " + vStatus + "s");
            return 0;
        }
    }
}
